﻿' ******************************************************************************
' ** 
' **  Yahoo Finance Managed
' **  Written by Marius Häusler 2010
' **  It would be pleasant, if you contact me when you are using this code.
' **  Contact: YahooFinanceManaged@gmail.com
' **  Project Home: http://code.google.com/p/yahoo-finance-managed/
' **  
' ******************************************************************************
' **  
' **  Copyright 2010 Marius Häusler
' **  
' **  Licensed under the Apache License, Version 2.0 (the "License");
' **  you may not use this file except in compliance with the License.
' **  You may obtain a copy of the License at
' **  
' **    http://www.apache.org/licenses/LICENSE-2.0
' **  
' **  Unless required by applicable law or agreed to in writing, software
' **  distributed under the License is distributed on an "AS IS" BASIS,
' **  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
' **  See the License for the specific language governing permissions and
' **  limitations under the License.
' ** 
' ******************************************************************************


Namespace Finance.Support

    ''' <summary>
    ''' Stores informations of a financial product. Implements IID. Serializable. 
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> _
    Public Class YID
        Implements IID
        Implements ISettableID

        Private ReadOnly mHelper As New MyHelper
        Private mID As String = String.Empty
        Private mName As String = String.Empty
        Private mIndustryName As String = String.Empty
        Private mStockExchange As StockExchange = Nothing
        Private mISIN As ISIN = Nothing
        Private mType As FinancialSecurityType = FinancialSecurityType.Any

        ''' <summary>
        ''' The full ID with suffix 
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overridable ReadOnly Property ID() As String Implements IID.ID
            Get
                Return mID
            End Get
        End Property
        Public Overridable Sub SetID(ByVal id As String) Implements ISettableID.SetID
            mID = id.ToUpper
            Dim se As StockExchange = WorldMarket.GetStockExchangeBySuffix(id)
            If se IsNot Nothing Then mStockExchange = se
        End Sub
        ''' <summary>
        ''' The base ID without suffix
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property BaseID() As String
            Get
                Dim index As Integer = mID.LastIndexOf("."c)
                If index = -1 Then : Return mID
                Else : Return mID.Substring(0, index)
                End If
            End Get
        End Property
        ''' <summary>
        ''' The suffix of the ID
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Suffix() As String
            Get
                Dim index As Integer = mID.LastIndexOf("."c)
                If index = -1 Then : Return String.Empty
                Else : Return mID.Substring(index)
                End If
            End Get
        End Property
        ''' <summary>
        ''' The name of the security
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property Name() As String
            Get
                Return mName
            End Get
            Set(ByVal value As String)
                mName = value
            End Set
        End Property
        ''' <summary>
        ''' The name of the industry
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property IndustryName() As String
            Get
                Return mIndustryName
            End Get
            Set(ByVal value As String)
                mIndustryName = value
            End Set
        End Property
        ''' <summary>
        ''' Informations about the stock exchange where the stock is traded
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks>Don't accept Null/Nothing.</remarks>
        Public Property StockExchange() As StockExchange
            Get
                Return mStockExchange
            End Get
            Set(ByVal value As StockExchange)
                mStockExchange = value
            End Set
        End Property
        ''' <summary>
        ''' The International Securities Identification Number
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property ISIN() As ISIN
            Get
                Return mISIN
            End Get
            Set(ByVal value As ISIN)
                mISIN = value
            End Set
        End Property
        ''' <summary>
        ''' The type of the security
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overridable Property Type() As FinancialSecurityType
            Get
                Return mType
            End Get
            Set(ByVal value As FinancialSecurityType)
                mType = value
            End Set
        End Property

        ''' <summary>
        ''' Default constructor
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New()
        End Sub
        ''' <summary>
        ''' Creates a new instance by an ID
        ''' </summary>
        ''' <param name="id"></param>
        ''' <remarks></remarks>
        Public Sub New(ByVal id As String)
            Me.SetID(id)
        End Sub
        ''' <summary>
        ''' Creates a new instance from an IDSearchResult
        ''' </summary>
        ''' <param name="searchResult"></param>
        ''' <remarks></remarks>
        Public Sub New(ByVal searchResult As IDSearchResult)
            If searchResult IsNot Nothing Then
                Me.SetID(searchResult.ID)
                Me.Name = searchResult.Name
                Me.IndustryName = searchResult.IndustryName
                Me.Type = searchResult.Type

                Dim se As StockExchange = WorldMarket.GetStockExchangeByID(searchResult.Exchange)
                If se Is Nothing And mStockExchange Is Nothing Then se = WorldMarket.GetStockExchangeByName(searchResult.Exchange)
                If se IsNot Nothing Then
                    mStockExchange = se
                Else
                    If mStockExchange Is Nothing Then mStockExchange = New StockExchange("", "", searchResult.Exchange)
                End If

                If searchResult.ISIN <> String.Empty Then
                    Try
                        Me.ISIN = New ISIN(searchResult.ISIN)
                    Catch ex As ArgumentException
                        Me.ISIN = Nothing
                    End Try
                End If

            Else
                Throw New ArgumentException("The passed result is null", "searchResult")
            End If
        End Sub

        ''' <summary>
        ''' Returns the URL of the Yahoo RSS news feed.
        ''' </summary>
        ''' <param name="server">The server of the feed. Decides language.</param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function RssNewsURL(Optional ByVal server As Server = Server.USA) As String
            Return "http://" & mHelper.ServerString(server) & "finance.yahoo.com/rss/headline?s=" & mHelper.CleanYqlParam(mID)
        End Function
        Public Function RssFinancialBlogsURL() As String
            Return "http://finance.yahoo.com/rss/SeekingAlpha?s=" & mHelper.CleanYqlParam(mID)
        End Function

        ''' <summary>
        ''' Returns the full ID of the stock.
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overrides Function ToString() As String
            Return mID
        End Function

    End Class

End Namespace
